18장 함수와 일급 객체
함수와 일급 객체
18-1 일급객체
- 무명의 리터럴로 생성할 수 있다. 즉 런타임에 생성 가능하다.
- 변수나 자료구조(객체, 배열 등)에 저장할 수 있다.
- 함수의 매개변수에 전달할 수 있다.
- 함수의 반환값으로 사용할 수 있다.
자바스크립트의 함수는 위 조건을 모두 만족하므로 일급 객체다.
// 1번조건 및 2번조건(함수는 변수에 저장가능)
// 런타임(할당 단계)에 함수 리터럴이 평가되어 함수 객체가 생성되고 변수에 할당된다.
const increase = function(num){
return ++num;
};
const decrease = function(num) {
ruturn --num;
};
const decrease = function(num) {
return --num;
};
// 2. 함수는 객체에 저장할 수 있다.
const auxs = {increase, decrease};
// 3. 함수의 매게변수에 전달할 수 있다.
// 4. 함수의 반환값으로 사용할 수 있다.
function makeCounter(aux) {
let num = 0;
return function() {
num = aux(num);
return num;
};
}
// 3. 함수는 매개변수에게 함수를 전달 가능
const increaser = makeCounter(auxs.increase);
console.log(increaser()); // 1
console.log(increaser()); // 2- 함수가 일급객체라는 것은 함수를 객체와 동일하게 사용할 수 있다는 의미이다.
- 객체는 값이므로 함수는 값과 동일하게 취급할 수 있다.
18-2 함수 객체의 프로퍼티
함수는 객체이므로, 함수도 프로퍼티를 갖을 수 있다.
console.dir 메서드로 함수 객체의 내부를 들여다보자!
function square(number) {
return number * number;
}
console.log(square);콘솔창 실행결과

- argu,emts, caller, length, name, prototype 등 여러가지 프로퍼티가 등장한다. 아래서 더 자세히 살펴보자.
arguments 프로퍼티
함수 호출 시 전달된 인수(arguments) 정보를 담고 있는 유사 배열 객체.
function example(a, b) {
console.log(arguments);
console.log(arguments[0]); // 첫 번째 인수
console.log(arguments.length); // 인수 개수
}
example(1, 2, 3);- 함수 내부에서 암묵적으로 사용 가능
- 배열처럼 인덱스로 접근 가능하지만 진짜 배열이 아님
유사 배열 객체와 이터러블
유사 배열 객체
length프로퍼티와 인덱스를 가진 객체 배열 메서드(forEach,map)를 직접 사용할 수 없음
function test() {
console.log(arguments);
console.log(Array.isArray(arguments)); // false
}
test(10, 20, 30);이터러블
Symbol.iterator메서드를 구현한 객체for...of문, 스프레드 문법 등 사용 가능
function test() {
for (const arg of arguments) {
console.log(arg);
}
}
test('A', 'B', 'C');arguments객체는 유사 배열 + 이터러블이다.
caller 프로퍼티
현재 함수를 호출한 다른 함수의 참조를 반환한다. ES 사양에 포함되지 않은 비표준 프로퍼티 이고, 이후 표준화될 예정도 없으므로 사용하진 말고 참고로만 알아두자. 관심없으면 지나쳐도 좋다!
function first() {
second();
}
function second() {
console.log(second.caller); // first 함수의 소스 출력
}
first();length 프로퍼티
함수 정의 시 명시된 매개변수(parameter) 개수를 나타낸다.
function foo(a, b, c) {}
console.log(foo.length); // 3- arguments 개수가 아니라, 선언된 파라미터 수를 의미한다.
name 프로퍼티
함수의 이름을 문자열로 반환한다.
function greet() {}
console.log(greet.name); // "greet"
const sayHi = function () {};
console.log(sayHi.name); // "sayHi" (ES6 이후 추론 가능)- 익명 함수 표현식도, ES6 이후에는 변수명 기반으로 name 자동 설정
- 디버깅 시 함수 식별에 유용
proto 접근자 프로퍼티
모든 객체는
__proto__를 통해 자신의 [[Prototype]] 내부 슬롯에 접근할 수 있다.
function hello() {}
console.log(hello.__proto__ === Function.prototype); // true
console.log(Function.prototype.__proto__ === Object.prototype); // true- proto는 접근자 프로퍼티(getter/setter)이며, 모든 객체가 프로토타입 체인을 통해 상속 구조를 형성한다.
prototype 프로퍼티
함수 객체만이 소유하는 특별한 프로퍼티. 생성자 함수로 호출될 때
, 인스턴스의 프로토타입 ([Prototype])으로 사용된다.
function Animal(name) {
this.name = name;
}
Animal.prototype.sayHi = function () {
console.log(`Hi, I'm ${this.name}`);
};
const dog = new Animal('Bori');
dog.sayHi(); // Hi, I'm Bori- 일반 객체에는 존재하지 않고, 함수 객체(특히 생성자 함수) 에만 존재
- 인스턴스가 생성될 때 자동으로 연결됨 (
instance.__proto__ === constructor.prototype)
| 프로퍼티 | 설명 | 비고 |
|---|---|---|
| arguments | 함수 호출 시 전달된 인수 정보 (유사 배열) | 내부에서만 사용 가능 |
| caller | 현재 함수를 호출한 함수 참조 | 비표준, 권장되지 않음 |
| length | 선언된 매개변수의 수 | arguments 개수 아님 |
| name | 함수 이름 | ES6 이후 자동 추론 |
| proto | [[Prototype]]에 접근하는 접근자 | 모든 객체에 존재 |
| prototype | 생성자 함수의 프로토타입 객체 | 함수 객체에만 존재 |
Last updated on